﻿using System.Collections.Generic;
using System.Linq;

namespace System
{
    /// <summary>
    /// 表示对 Linq 的扩展。
    /// </summary>
    public static class LinqExtension
    {
        /// <summary>
        /// 对当前排序结果进行分页。
        /// </summary>
        /// <typeparam name="T">分页的类型。</typeparam>
        /// <param name="source">已排序过的 <see cref="IOrderedQueryable{T}"/> 可查询对象。</param>
        /// <param name="page">当前页码。</param>
        /// <param name="itemsPerPage">每页的数据量。</param>
        /// <returns>拥有基本分页的字段。</returns>
        public static (IEnumerable<T> items, int count, int pages, int page,int itemsPerPage) Paged<T>(this IQueryable<T> source, int page, int itemsPerPage)
        {
            var pagedList = source.Skip((page - 1) * itemsPerPage).Take(itemsPerPage);
            var count = source.Count();
            var pages = count / itemsPerPage;
            if (count % itemsPerPage != 0)
            {
                pages += 1;
            }

            return (pagedList.ToList(), count, pages, page, itemsPerPage);
        }

        /// <summary>
        /// 转换成分页集合类型。
        /// </summary>
        /// <typeparam name="T">分页集合的类型。</typeparam>
        /// <param name="pagedObject">已分页的对象。</param>
        /// <returns>一个分页的集合。</returns>
        public static PagedCollection<T> AsPageCollection<T>(this (IEnumerable<T> items, int count, int pages, int page, int itemsPerPage) pagedObject) 
            => new PagedCollection<T>(pagedObject.page, pagedObject.itemsPerPage, pagedObject.pages, pagedObject.items, pagedObject.count);        
    }
}
